package main

import "fmt"

func main() {
	fmt.Println("数组的定义----------------------------------------------=--------")
	fmt.Println()

	// 数组的定义 var 数组名 [数组大小]数据类型
	var scores [5]int
	scores[0] = 95
	scores[1] = 91
	scores[2] = 39
	scores[3] = 60
	scores[4] = 21

	//遍历求和
	sum := 0
	for i := 0; i < len(scores); i++ {
		sum += scores[i]
	}
	avg := sum / len(scores)
	fmt.Printf("平均成绩 avg = %v", avg)
	fmt.Println()

	fmt.Println("数组内存空间----------------------------------------------=--------")
	fmt.Println()

	//声明数组： int16占用2个字节
	var arr [3]int16
	//获取数组的长度：
	fmt.Println(len(arr))
	//证明arr中存储的是地址值：
	fmt.Printf("arr的地址为：%p \n", &arr)
	// 第一空间地址值
	fmt.Printf("arr[0]的地址为：%p \n", &arr[0])
	// 第二空间地址值
	fmt.Printf("arr[1]的地址为：%p \n", &arr[1])
	// 第三空间
	fmt.Printf("arr[2]的地址为：%p \n", &arr[2])
	arr[0] = 10
	arr[1] = 20
	arr[2] = 30
	fmt.Println(arr)

	fmt.Println("数组遍历----------------------------------------------=--------")
	fmt.Println()

	var scores1 [5]int
	//将成绩存入数组：(循环 + 终端输入)
	for i := 0; i < len(scores1); i++ {
		fmt.Printf("请录入第个%d学生的成绩", i+1)
		fmt.Scanln(&scores1[i])
	}
	// 普通for循环
	for i := 0; i < len(scores); i++ {
		fmt.Printf("第%d个学生的成绩为：%d\n", i+1, scores[i])
	}

	//for-range循环
	for key, value := range scores1 {
		fmt.Printf("第%d个学生的成绩为：%d\n", key+1, value)
	}
	fmt.Println()

	fmt.Println("数组初始化----------------------------------------------=--------")
	fmt.Println()
	//第一种
	var arr1 [3]int = [3]int{1, 2, 3}
	fmt.Println("第一种初始化方式：", arr1)
	//第二种
	var arr2 = [3]int{4, 5, 6}
	fmt.Println("第二种初始化方式：", arr2)
	//第三种
	var arr3 = [...]int{7, 8, 9}
	fmt.Println("第三种初始化方式：", arr3)
	//第四种
	var arr4 = [...]int{2: 66, 1: 99, 0: 22, 3: 11, 4: 77}
	fmt.Println("第四种初始化方式：", arr4)
	fmt.Println()

	fmt.Println("在其它函数中，去修改原来的数组，可以使用引用传递(指针方式-----------------------=--------")
	fmt.Println()
	//如想在其它函数中，去修改原来的数组，可以使用引用传递(指针方式)
	var array = [3]int{4, 5, 6}
	test(&array)
	fmt.Println(array)

	fmt.Println("二维数组初始化----------------------------------------------=--------")
	fmt.Println()
	var array1 [2][3]int = [2][3]int{{1, 2, 3}, {4, 5, 6}}
	fmt.Println("array1 = ", array1)

	var array2 = [2][3]int{{7, 8, 9}, {10, 11, 12}}
	fmt.Println("array2 = ", array2)

	// 不允许连续使用[...][...] 内层指定[3] 或者动态分配[]
	var array3 = [...][]int{{22, 23, 25}, {26, 27, 28}}
	fmt.Println("array3 = ", array3)
	fmt.Println()

	fmt.Println("二维数组遍历----------------------------------------------=--------")
	fmt.Println()

	var array6 = [][]int{{33, 34, 35}, {26, 27, 28}}
	// 普通for
	for i := 0; i < len(array6); i++ {
		for j := 0; j < len(array6[i]); j++ {
			fmt.Printf("arr[%v][%v]=%v\t", i, j, array6[i][j])
		}
		fmt.Println()
	}
	fmt.Println("------------------------")

	for key, value := range array6 {
		for k, v := range value {
			fmt.Printf("arr[%v][%v]=%v\t", key, k, v)
		}
		fmt.Println()
	}
}

func test(arr *[3]int) {
	(*arr)[0] = 7
}
